package com.cmict.data.bpm.service.task;

import com.cmict.data.framework.common.pojo.CommonResult;
import com.cmict.data.framework.common.pojo.PageResult;
import com.cmict.data.bpm.controller.admin.definition.vo.task.TaskCarbonVO;
import com.cmict.data.bpm.controller.admin.definition.vo.task.TaskVariableCreateReqVO;
import com.cmict.data.bpm.controller.admin.definition.vo.task.TaskVariablePageReqVO;
import com.cmict.data.bpm.controller.admin.task.vo.task.*;
import org.flowable.idm.api.User;
import org.flowable.task.api.Task;

import java.util.Collection;
import java.util.List;

/**
 * @author liutao
 * @date 2022/4/7
 */
public interface IFlowableTaskService {

    /**
     * 驳回任意节点 暂时没有考虑子流程
     *
     * @param backTaskVo 参数
     * @return
     */
    CommonResult<String> backTask(BackTaskVo backTaskVo);

    CommonResult<String> batchBackTask(BackTaskDistVo backTaskVos);


    CommonResult<String> backTask(BackTaskDistVo backTaskVo);

    /**
     * 查询可退回节点
     *
     * @param taskId
     * @return
     */
    List<FlowNodeVo> getBackNodes(Long userId, String taskId);

    /**
     * 获取可驳回节点列表
     *
     * @param taskId 任务id
     * @return
     */
    List<FlowNodeVo> getBackNodes(String taskId);

    /**
     * 任务前加签 （如果多次加签只能显示第一次前加签的处理人来处理任务）
     * 多个加签人处理完毕任务之后又流到自己这里
     *
     * @param addSignTaskVo 参数
     * @return
     */
    CommonResult<String> beforeAddSignTask(AddSignTaskVo addSignTaskVo);

    /**
     * 任务后加签（加签人自己自动审批完毕加签多个人处理任务）
     *
     * @param addSignTaskVo 参数
     * @return
     */
    CommonResult<String> afterAddSignTask(AddSignTaskVo addSignTaskVo);

    /**
     * 任务加签
     *
     * @param addSignTaskVo 参数
     * @param flag          true向后加签  false向前加签
     * @return
     */
    CommonResult<String> addSignTask(AddSignTaskVo addSignTaskVo, Boolean flag);

    /**
     * 反签收任务
     *
     * @param claimTaskVo 参数
     * @return
     */
    CommonResult<String> unClaimTask(ClaimTaskVo claimTaskVo);

    /**
     * 签收任务
     *
     * @param claimTaskVo 参数
     * @return
     */
    CommonResult<String> claimTask(ClaimTaskVo claimTaskVo);

    /**
     * 委派任务
     *
     * @param delegateTaskVo 参数
     * @return
     */
    CommonResult<String> delegateTask(DelegateTaskVo delegateTaskVo);

    /**
     * 转办
     *
     * @param turnTaskVo 转办任务VO
     * @return 返回信息
     */
    CommonResult<String> turnTask(TurnTaskVo turnTaskVo);

    /**
     * 执行任务
     *
     * @param params 参数
     */
    CommonResult<String> complete(CompleteTaskVo params);

    /**
     * 通过任务id获取任务对象
     *
     * @param taskId 任务id
     * @return
     */
    CommonResult<Task> findTaskById(String taskId);

    /**
     * 查询待办任务列表
     *
     * @param params 参数
     * @return
     */
//    public Page<TaskVo> getApplyingTasks(TaskQueryVo params, Query query);

    /**
     * 查询已办任务列表
     *
     * @param params 参数
     * @return
     */
//    public Page<TaskVo> getApplyedTasks(TaskQueryVo params, Query query);

    /**
     * 通过流程实例id获取流程实例的待办任务审批人列表
     *
     * @param processInstanceId 流程实例id
     * @return
     */
    List<User> getApprovers(String processInstanceId);

    /**
     * 通过任务id判断当前节点是不是并行网关的节点
     *
     * @param taskId 任务id
     * @return
     */
    boolean checkParallelgatewayNode(String taskId);

    boolean createCarbonTask(CarbonTaskInfoVo taskInfoVo);

    Long createCarbonVariable(TaskVariableCreateReqVO taskVariableCreateReqVO);

    Long createBatchCarbonVariable(TaskVariableCreateReqVO taskVariableCreateReqVO);


    PageResult<TaskCarbonVO> getCarbonTask(TaskVariablePageReqVO pageReqVO);

    /**
     * 完成抄送我的任务
     * @param carbonId
     * @return
     */
    boolean completeCarbonTask(Long carbonId);

    boolean deleteCarbonTask(Long carbonId);

    void batchDeleteCarbon(Collection<Long> ids);
}
